package j.framework.query;

import j.framework.base.service.SystemService;
import j.framework.query.core.QueryMetadata;
import j.util.New;
import j.util.SpringBeans;
import j.util.StringUtils;

import java.util.Map;

/**
 * 自定义查询管理器，这里缓存所有的查询
 * User: jason
 * Date: 2015/3/31 12:27
 */
public class QueryMetadataManager {
    private SystemService service;
    private final static QueryMetadataManager instance = new QueryMetadataManager();
    private QueryMetadataManager(){
        service = SpringBeans.getBean(SystemService.class);
    }

    //自定义查询缓存容器,key为queryKey，即开发人员定义的key
    public final Map<String,QueryMetadata> queryMetadataMap = New.map();
    //queryId与开发人员定义的key的映射
    public final Map<String,String> queryMetadataIdKeyMapper = New.map();

    /**
     * 从缓存池中获取自定义查询元数据配置
     * @param queryKey
     * @return
     */
    public static QueryMetadata getQueryMetadata(String queryKey) {
        QueryMetadata qmd = instance._getQueryMetadata(queryKey);
        if(qmd == null){
            synchronized (QueryMetadataManager.class){
                qmd = instance._getQueryMetadata(queryKey);
                if(qmd == null){
                    //没有缓存，从数据库中获取，并放到缓存中
                    qmd = instance.service.getQueryMetadata(queryKey);
                    if(qmd!=null){
                        instance.queryMetadataMap.put(qmd.getQueryKey(),qmd);
                        instance.queryMetadataIdKeyMapper.put(qmd.getQueryId(),qmd.getQueryKey());
                    }
                }
            }
        }
        return qmd;
    }

    private  QueryMetadata _getQueryMetadata(String queryKey){
        QueryMetadata qmd = instance.queryMetadataMap.get(queryKey);
        if(qmd == null){
            String key = instance.queryMetadataIdKeyMapper.get(queryKey);
            if(StringUtils.isNotEmpty(key)){
                qmd = instance.queryMetadataMap.get(key);
            }
        }
        return qmd;
    }

    /**
     * 重新加载自定义查询
     * @param queryId
     */
    public static void reloadQuery(String queryId) {
        QueryMetadata qmd = instance.service.getQueryMetadata(queryId);
        if(qmd!=null){
            instance.queryMetadataMap.put(qmd.getQueryKey(),qmd);
            instance.queryMetadataIdKeyMapper.put(qmd.getQueryId(),qmd.getQueryKey());
        }
    }
}
